#ifndef VZLPR_ADDON_ASYNCMODEL_H_
#define VZLPR_ADDON_ASYNCMODEL_H_

#include "Common.h"
#include "JsonObject.h"

void async_callback(uv_async_t* handle);

class AsyncModel {
 public:
  AsyncModel(std::function<void(JsonObject::Ptr)> invoke);
  AsyncModel(Nan::Callback* callback);
  ~AsyncModel();

  void SetExtendData(void* extend_data);

  void* GetExtendData();

  JsonObject::Ptr GetData();

  int Send();

  void Callback();

  void Wake();

  void Wait();

 private:
  HANDLE event_;
  uv_async_t* async_;
  void* extend_data_;
  JsonObject::Ptr data_;
  Nan::Callback* callback_;
  std::function<void(JsonObject::Ptr)> invoke_;
};

#endif //  VZLPR_ADDON_ASYNCMODEL_H_
